package rpc.client;

import java.util.*;
import net.hangar5.xmlrpc.*;
import mat.i2c.master.BusI2c;

public class StubAccesParking
{
    RpcClient client;
    String myUrl;

    public StubAccesParking()
    {
	client = new RpcClient();
    }

    public StubAccesParking(String url)
    {
	myUrl = url;
	try
	{
	    client = new RpcClient(url);
	}
	catch (Exception other)
	{
	    myUrl = null;
	    System.err.println ("Exception in client: "+other);
	    other.printStackTrace();
	}
	//client.setKeepAlive( true );
    }

    public void setURL(String url)
    {
	myUrl = url;
	try
	{
	    client.setUrl(url);
	    //System.out.println("setURL: " + url);
	}
	catch (Exception other)
	{
	    myUrl = null;
	    System.err.println ("Exception in client: "+other);
	    other.printStackTrace();
	}
	//client.setKeepAlive( true );
    }


    public String getURL()
    {
	if (myUrl != null)
	{
	    return myUrl;
	}
	else return "url non initialisee";
    }

    //***************************************************************************
    //***************************************************************************

    // l'accesParking auquel on est connecte:
    // - se de enregistre aupres du superviseur: celui-ci l'ignorera dans la gestion des acces
    // - passe en mode test: il recoit directement les trames I2c

    public void setBusConnexion(boolean on)
    {
	setTest(on);
    }
    public void setNumeroAcces(int numero)
    {

    }

    // l'accesParking auquel on est connecte:
    // quitte le mode test
    // -se re enregistre aupres du superviseur


    public int getClockDelay()
    {
	return 0; // pas implemente pour l'instant
    }

    public void setClockDelay(int delai)
    {
	// pas implemente pour l'instant
    }

    public int doTrame(byte[] trame)
    {
	int resultat = -1;
	final String methode = "doTrame";
	try
	{
	    Vector v = new Vector();
	    v.addElement(trame);
	    byte[] result = (byte[])client.execute(methode, v);
	    int l = result.length;

	    if (trame.length == l)
	    {
		for (int i= 0; i < l; i++)
		{
		    trame[i] = result[i];
		}
		resultat = l;
	    }
	}
	catch (Exception x) {printErreur(x, methode);}
	return resultat;
    }

    public final boolean setTest(boolean on)
    {
	boolean resultat = false;
	String methode = "setTest";
	try
	{
	    Vector v = new Vector(1);
	    v.addElement(new Boolean(on));
	    Object result = client.execute (methode, v);
	    resultat = ((Boolean)result).booleanValue();
	}
	catch (Exception x) {printErreur(x, methode);}
	return resultat;
    }


    public final boolean isAccesOK(final String ValString)
    {
	boolean resultat = false;
	String str = "";
	final String methode = "wd";
	try
	{
	    Vector v = new Vector(1);
	    v.addElement(ValString);
	    Object result = client.execute(methode, v);
	    str = (String) result;
	    resultat = str.equals("wd");
	}
	catch (Exception x) {printErreur(x, methode);}
	return resultat;
    }


    // methode utilisee uniquement par Applet -> AppletRpcServlet -> RpcAccesBridgeMethodes
    public final Vector getAllUrlAcces()
    {
	Vector resultat = null;
	String methode = "getAllUrlAcces";
	try
	{
	    Vector v = new Vector();
	    Object result = client.execute (methode, v);
	    resultat = (Vector)result;
	    //int l = resultat.size();
	}
	catch (Exception x) {printErreur(x, methode);}
	return resultat;
    }

    // methode utilisee uniquement par Applet -> AppletRpcServlet -> RpcAccesBridgeMethodes
    public final boolean setUrlAcces(String url)
    {
	boolean resultat = false;
	String methode = "setUrlAcces";
	try
	{
	    Vector v = new Vector(1);
	    v.addElement(url);
	    Object result = client.execute (methode, v);
	    resultat = ((Boolean)result).booleanValue();
	}
	catch (Exception x) {printErreur(x, methode);}
	return resultat;
    }


    private final void printErreur(final Exception x, final String methode)
    {
	System.err.println("Execution sur superviseur de " + methode + " impossible @" + getURL() + "[" + x.toString() + "]");
    }


}